tg-me.com/machinelearning_interview/1785
Last Update:
🧩 Задача для дата-сайентистов: "Средняя зарплата" (с подвохом)
📖 Описание задачи
У вас есть DataFrame df
с данными о зарплатах сотрудников компании:
import pandas as pd
data = {
'employee_id': [1, 2, 3, 4, 5, 6],
'department': ['IT', 'IT', 'HR', 'HR', 'Finance', 'Finance'],
'salary': [100000, None, 50000, None, 70000, None]
}
df = pd.DataFrame(data)
print(df)
Результат:
employee_id department salary
0 1 IT 100000.0
1 2 IT NaN
2 3 HR 50000.0
3 4 HR NaN
4 5 Finance 70000.0
5 6 Finance NaN
В задаче требуется заполнить пропущенные значения зарплат в каждом отделе медианой зарплаты этого отдела.
Если медиана не может быть рассчитана (например, все значения NaN) — оставить NaN.
Вы пишете следующий код:
df['salary_filled'] = df.groupby('department')['salary'].transform(lambda x: x.fillna(x.median()))
✅ Код выполняется без ошибок, но когда вы проверяете результат:
print(df)
Получаете:
employee_id department salary salary_filled
0 1 IT 100000.0 100000.0
1 2 IT NaN 100000.0
2 3 HR 50000.0 50000.0
3 4 HR NaN 50000.0
4 5 Finance 70000.0 70000.0
5 6 Finance NaN 70000.0
✅ Всё вроде бы верно…
Но через неделю приходит заказчик и говорит:
> «Ты заполнил пропуски, но потом выяснилось, что в реальных данных в одном отделе все зарплаты NaN, а значит медиана не существует.
> А в твоём коде при такой ситуации почему-то появляется 0 вместо NaN!»
📝 Вопросы:
1. Почему появилось 0 (хотя ожидалось NaN)?
2. Как переписать код так, чтобы:
- Если медиана существует → заполнить ею NaN
- Если медиана не существует (все значения NaN) → оставить NaN
---
🎯 Что проверяет задача:
✅ Понимание, как
median()
работает на пустой серии ✅ Понимание, что
fillna(np.nan)
может привести к замещению на 0 при приведении типов ✅ Умение работать с группами, где нет данных
---
💡 Подсказка:
Если `x.median()` вернёт `nan`, то `x.fillna(nan)` оставит NaN внутри группы, **но transform может "автоматически" заменить NaN на 0 при сборке результата** (особенность Pandas).
Нужно явно управлять значением медианы, чтобы избежать непредвиденного замещения.
✅ Ожидаемое правильное решение:
```python
def fill_with_median_or_nan(x):
med = x.median()
return x.fillna(med if pd.notna(med) else np.nan)
df['salary_filled'] = df.groupby('department')['salary'].transform(fill_with_median_or_nan)
```
Теперь в отделах, где медиана не существует, **NaN останется NaN**, а не превратится в 0.
🔥 Дополнительный подвох (для усложнения):
Что будет, если отдел состоит только из одного сотрудника с NaN?
→ Нужно ли обработать случай, где в отделе всего 1 запись и она NaN?
📝 Вывод:
Эта задача проверяет:
✅ Понимание нюансов заполнения пропусков в Pandas
✅ Внимательность к corner-case ситуациям
✅ Умение работать с группами с частично или полностью отсутствующими данными
🔥 Отличная тренировка внимательности и глубины понимания Pandas!
BY Machine learning Interview
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/machinelearning_interview/1785